package interview;

/**
 * @author distantstar
 * @version 1.0
 * @date 2021
 * @description interview
 * @since JDK1.8
 *
 * 下一个数。给定一个正整数，找出与其二进制表达式中1的个数相同且大小最接近的那两个数（一个略大，一个略小）。
 *
 * 示例1:
 *
 *  输入：num = 2（或者0b10）
 *  输出：[4, 1] 或者（[0b100, 0b1]）
 *
 * 示例2:
 *  输入：num = 1
 *  输出：[2, -1]
 *
 * num的范围在[1, 2147483647]之间；
 * 如果找不到前一个或者后一个满足条件的正数，那么输出 -1。
 *
 * https://leetcode-cn.com/problems/closed-number-lcci/
 */
public class ClosedNumberLCCI {
    public static int[] findClosedNumbers(int num) {
        long right = (num & (~num + 1));

        long topBorder = (right + num);
        long maxValue = Integer.MAX_VALUE;
        int bigger = 0, smaller = 0;
        if (topBorder > maxValue) {
            bigger = -1;
        } else {
            bigger = (int) right + num;
        }
        smaller = (int) (num ^ right) + 1;

        return new int[]{bigger, smaller == num ? -1 : smaller};
    }

    public static void main(String[] args) {
        System.out.println(findClosedNumbers(3)[0] + " " + findClosedNumbers(3)[1]);
    }
}
